package create

import (
	"context"
	"fmt"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
)

// 下面是数组相关的新增方法

// 这种方法只能每次添加一个元素，所以下面的方法与预期不同，addToSet不保证元素一定添加到数组的末尾
func AddArrayElement(mongo *mongo.Database, ctx context.Context) {
	// 给UpdateMany加一些筛选条件，避免出现不存在object字段的问题
	findField := bson.M{"stringlist": bson.M{"$exists": true, "$type": 4}}
	// 使用addToSet关键字给stringlist添加一个元素
	updateField := bson.M{"$addToSet": bson.M{"stringlist": []string{"addText1", "addText2"}}}
	result, err := mongo.Collection("test").UpdateOne(ctx, findField, updateField)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("匹配文档的数量:", result.MatchedCount)
	fmt.Println("修改文档的数量:", result.MatchedCount)
}

// 这种方法才是将值逐个插入数组，实现给数组新增多个元素
func AddArrayElementWithEach(mongo *mongo.Database, ctx context.Context) {
	// 给UpdateMany加一些筛选条件，避免出现不存在object字段的问题
	findField := bson.M{"stringlist": bson.M{"$exists": true, "$type": 4}}
	// 使用addToSet关键字给stringlist添加一个元素
	updateField := bson.M{"$addToSet": bson.M{"stringlist": bson.M{"$each": []string{"addText1", "addText2"}}}}
	result, err := mongo.Collection("test").UpdateOne(ctx, findField, updateField)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("匹配文档的数量:", result.MatchedCount)
	fmt.Println("修改文档的数量:", result.MatchedCount)
}

// push方法与addToSet不同的是不会检查是否重复，push保证元素一定添加到末尾
func AddArrayElementWithPush(mongo *mongo.Database, ctx context.Context) {
	// 给UpdateMany加一些筛选条件，避免出现不存在object字段的问题
	findField := bson.M{"stringlist": bson.M{"$exists": true, "$type": 4}}
	// 使用push关键字给stringlist添加元素
	updateField := bson.M{"$push": bson.M{"stringlist": "pushText1"}} // 也可以像上面那样使用$each添加多个元素
	result, err := mongo.Collection("test").UpdateOne(ctx, findField, updateField)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("匹配文档的数量:", result.MatchedCount)
	fmt.Println("修改文档的数量:", result.MatchedCount)
}

// push方法且指定插入元素的位置
func AddArrayElementWithPosition(mongo *mongo.Database, ctx context.Context) {
	// 给UpdateMany加一些筛选条件，避免出现不存在object字段的问题
	findField := bson.M{"stringlist": bson.M{"$exists": true, "$type": 4}}
	// 使用push关键字给stringlist添加元素
	// 使用$position关键字指定插入位置，还可以用负数，-1表示插入到倒数第一个元素的前面
	// 但是这种方法必须搭配$each一起使用，哪怕值添加一个元素
	updateField := bson.M{"$push": bson.M{"stringlist": bson.M{"$each": []string{"pushText1"}, "$position": -1}}}
	result, err := mongo.Collection("test").UpdateOne(ctx, findField, updateField)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("匹配文档的数量:", result.MatchedCount)
	fmt.Println("修改文档的数量:", result.MatchedCount)
}
